﻿using System;
using System.Reflection;
using AiFrame.InterfaceLib.Plugins;

namespace AiFrame.Base.Core.Plugins
{
    /// <summary>
    /// Diese Klasse ist dafür da, den PluginManager zu laden entladen.
    /// Es darf nur einer Instanz dieser Klasse geben, deshalb ist es ein Singleton.
    /// </summary>
    public class PluginManagerLoader
    {
        private static PluginManagerLoader _instance;
        private IPluginManager _pluginManager;

        public IPluginManager GetPluginManager()
        {
            return _pluginManager;
        }

        public static PluginManagerLoader Instance()
        {
            if (_instance == null)
            {
                _instance = new PluginManagerLoader();
            }
            return _instance;
        }

        private  PluginManagerLoader()
        {
            
        }

        /// <summary>
        /// Lädt den PluginManager. Für die Benutzerschnittstelle müssen
        /// notwendige Objekte mitgegeben werden, damit das CoreInterface erstellt
        /// werden kann.
        /// </summary>
        /// <param name="directory">Das Programmverzeichnis. Ohne abschließendes "\\".</param>
        /// <returns></returns>
        public IPluginManager LoadPluginManager(string directory)
        {
            _pluginManager = null;

            try
            {
                Assembly assembly = Assembly.LoadFrom(directory + "\\Plugins.PluginManager.dll");
                Type[] types = assembly.GetExportedTypes();

                foreach (Type type in types)
                {
                    if (typeof(IPluginManager).IsAssignableFrom(type))
                    {
                        ConstructorInfo ci = type.GetConstructor(new Type[0]);

                        _pluginManager = (IPluginManager) ci.Invoke(new Object[0]);
                    }
                }
            }
            catch (Exception)
            {
                throw new PluginManagerLoadException("Fehler beim Laden des PluginManagers.");
            }
            return _pluginManager;

        }
    }
}